package redis

// Pool 全局开放接口
type Pool interface {
	GetString() *str
	GetSet() *set
	GetHash() *hash
	GetPing() *ping
	GetKey() *key
}

// setOption 动态设置参数接口
// 	实现流程：funcOption实现此接口，把poolOption指针传递进去，然后使用开放接口修改指定的值，如：SetMaxIdle
type setOption interface {
	apply(*poolOption)
}

// poolOption 配置参数
type poolOption struct {
	Host     string
	MaxIdle  int
	Password string
}

// defaultPoolOption 默认参数
func defaultPoolOption() *poolOption {
	return &poolOption{
		// 默认的最大空间连接数
		MaxIdle:  5,
		Host:     "127.0.0.1",
		Password: "",
	}
}

// funcOption 动态参数设置
type funcOption struct {
	f func(*poolOption)
}

// apply 实现setOption接口
// 	参数
//		poolOption 配置参数
func (fo *funcOption) apply(o *poolOption) {
	fo.f(o)
}

func createFuncOption(f func(*poolOption)) setOption {
	return &funcOption{
		f: f,
	}
}

type poolConfig struct {
}

var PoolConfig = new(poolConfig)

func (p *poolConfig) SetMaxIdle(num int) setOption {
	return createFuncOption(func(po *poolOption) {
		po.MaxIdle = num
	})
}

func (p *poolConfig) SetHost(host string) setOption {
	return createFuncOption(func(po *poolOption) {
		po.Host = host
	})
}

func (p *poolConfig) SetPassword(password string) setOption {
	return createFuncOption(func(option *poolOption) {
		option.Password = password
	})
}
